package SIC.Modele.DataExpress;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Map.Entry;

import SIC.Modele.Composition;
import SIC.Modele.Data;
import SIC.Modele.Produit;

/**
 * Cette classe parse les fichiers STEP
 */
public class DataExpress extends Data {
	
	/** Le fichier à parser */
	String fichier;
	
	public DataExpress(String fichier) {
		this.fichier = fichier;
	}

	/**
	 * Parse le fichier EXPRESS passé en paramètre,
	 * et remplit la liste des produits ainsi que la liste des compositions
	 */
	@Override
	public void initData(){
			
		//On sauvegarde le nom des composant d'un produit
		Map<String, List<String> > mapCompositions = new HashMap<String, List<String>>();
		
		try
		{
			Scanner scanner = new Scanner(new File(fichier));
			
			while (scanner.hasNextLine())
			{
			    String ligne = scanner.nextLine();
			    
			    //les produits
			    if(ligne.startsWith("#"))
			    {	
			    	
			    	//Exemple : #7 = Produit('P7','Pointe',(#8,#9));
			    	
			    	//'P7'
			    	int start = ligne.indexOf("'");
			    	int end = ligne.indexOf("'", start + 1);

			    	//P7
			    	String produitID = ligne.substring(start+1, end);
			    	
			    	//'Pointe'
			    	start = ligne.indexOf("'", end + 1);
			    	end = ligne.indexOf("'", start + 1);
			    	
			    	//Pointe
			    	String produitNom = ligne.substring(start+1, end);
			    	
			    	Produit nouveauProd = new Produit(produitID, produitNom);
			    	mapProduits.put(produitID, nouveauProd);

			    	//#8,
			    	start = ligne.indexOf("#", end + 1);
			    	end = ligne.indexOf(",", start + 1);
			    	
			    	//tant qu'on a des # c'est qu'on a des composants
			    	if(start != -1)
			    	{
				    	List<String> composants = new ArrayList<String>();
			    		mapCompositions.put(produitID, composants);

				    	while(start != -1)
				    	{
				    		if(end == -1) //dernier composant
				    			end = ligne.indexOf(")", start + 1); //on cherche )
				    		
					    	String compo = ligne.substring(start+1, end);
					    	composants.add("P"+compo);
	
					    	start = ligne.indexOf("#", end + 1); //on passe au # suivant
					    	end = ligne.indexOf(",", start + 1); //on passe à la virgule suivante
				    	}
			    	}
			    }
			}

			scanner.close();
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
			
		
		//On pacrourt chaque composition
		for(Entry<String, List<String> >  entry : mapCompositions.entrySet())
		{
			String produitID = entry.getKey(); //on récupère l'id du produit
			List<String> composants =  entry.getValue(); //et le nom de ses composants
			
			if(!composants.isEmpty()) //une crée une composition ssi il y a des composants
			{
				Composition composition = new Composition(produitID);
		    	
				//on ajoute les composants (= les sous-produits)
				for(String composant : composants)
					composition.addComposant(mapProduits.get(composant));
				
				this.mapCompositions.put(produitID, composition);
			}
			
		}
	}
	
}
